home *** CD-ROM | disk | FTP | other *** search
/ Acorn User: The Risc OS Music Utilities CD / Acorn User: The Risc OS Music Utilities CD.iso / ARGONET / REPLAYER.SPK / h / replayer < prev   
Text File  |  1998-09-04  |  6KB  |  177 lines

  1.  
  2. /* replayer.h */
  3. /* A portable interface for playing Replay file. */
  4.  
  5. #ifndef lib_replayer_H
  6. #define lib_replayer_H
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include "Dreamscape:bool.h"
  11.  
  12. #include "replaydriver.h"
  13.  
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17.  
  18.  
  19. typedef struct replayer_file replayer_file;
  20. typedef struct replayer_header replayer_header;
  21. typedef struct replayer_soundtrack_info replayer_soundtrack_info;
  22. typedef struct replayer_sound_driver_info replayer_sound_driver_info;
  23. typedef struct replayer_chunk_entry replayer_chunk_entry;
  24.  
  25.  
  26. /* The structure is declared here to be shared across files, but its
  27.    contents are *private* and you must not rely on them. */
  28. struct replayer_file {
  29.   /* Basic information about file */
  30.   char *filename;
  31.   replayer_header *header;
  32.   replayer_chunk_entry *chunks;
  33.  
  34.   /* Playback preferences. */
  35.   char quality; /* 1--4 */
  36.   unsigned skip_late_data: 1;
  37. #ifndef replayer_NO_BACKWARDS
  38.   unsigned backwards: 1;
  39. #endif
  40.  
  41.   /* Data for sound playing */
  42.   replaydriver_driver *driver;
  43.   replaydriver_control *control;
  44.   replaydriver_buffer *buffer;
  45.   int file; /* OSLib is broken:  os_f should not be a byte. */
  46.   int current_chunk;       /* The next chunk to be read from the file. */
  47.   int track_playing;       /* The track number we're playing (usually 0). */
  48.   unsigned playing: 1;     /* Whether we're playing sound or not. */
  49.   unsigned next_buffer: 1; /* The buffer that will be empty next (0 or 1). */
  50. };
  51.  
  52. /* Pointers here can't be const unfortunately, otherwise I can't
  53.    delete them. */
  54. struct replayer_header {
  55.   char *title, *date_and_copyright, *other_details;
  56.  
  57.   /* Video info. */
  58.   char *video_type;
  59.   int width, height, colour_depth, fps;
  60.  
  61.   /* Soundtracks info. */
  62.   int no_soundtracks;
  63.   replayer_soundtrack_info *soundtracks;
  64.  
  65.   int no_chunks,        /* Number of chunks - 1 */
  66.       frames_per_chunk;
  67.   int even_chunk_size, odd_chunk_size;
  68.   int chunk_catalogue;        /* Offset in file to chunk catalogue. */
  69.   int sprite_offset, sprite_size;    /* Sprite info. */
  70.   int key_frames_offset;
  71. };
  72.  
  73. struct replayer_soundtrack_info {
  74.   int type_number;
  75.   char *type; /* For type 2, this is contains the leafname of the driver,
  76.         otherwise it contains the whole header line. */
  77.  
  78.   double rate; /* Converted to Hz for you. */
  79.   int channels, precision;
  80.   unsigned reverse_channels: 1;
  81.   unsigned linear_sound: 1;
  82.   unsigned unsigned_sound: 1;
  83.   unsigned adpcm_sound: 1;
  84. };
  85.  
  86. struct replayer_sound_driver_info {
  87.   char *name, *copyright;
  88.  
  89.   /* If 0, playback can only start at the beginning of a chunk;
  90.      if 1, playback can start at any sample in a chunk;
  91.      other values reserved. */
  92.   int start_anywhere;
  93.  
  94.   /* This is distinct from the number of bits given in the soundtrack info.
  95.      This talks about the decompression buffer, not the sample buffer you
  96.      supply the driver with filled. */
  97.   int precision;
  98.  
  99.   /* For these, see section 10 of ToUseSound: */
  100.   unsigned variable_ratio: 1; /* Set if no constant bits/sample ratio. */
  101.   double max_sample_bits; /* Max size of a compressed sample, in bits. */
  102.   int buffer_overhead; /* Overhead for From16 buffer, per channel. */
  103. };
  104.  
  105. struct replayer_chunk_entry {
  106.   int offset, video_size, sound_size[1];
  107. };
  108. #define replayer_chunk_entry_SIZE(channels)    \
  109.     (sizeof(int) * 2 + sizeof(int) * channels)
  110.  
  111.  
  112. /* Initialisation/finalisation methods. */
  113. replayer_file *replayer_create_file(const char *filename);
  114. void replayer_destroy(replayer_file *obj);
  115.  
  116. /* Methods for reading essential information. */
  117. const replayer_header *replayer_get_header(const replayer_file *obj);
  118. const replayer_chunk_entry *replayer_get_chunk_catalogue
  119.     (const replayer_file *obj);
  120. int replayer_get_length(const replayer_file *obj);
  121.  
  122. /* Reading info about sound drivers. */
  123. replayer_sound_driver_info *replayer_get_driver_info_from_soundtrack
  124.     (const replayer_soundtrack_info *info);
  125. replayer_sound_driver_info *replayer_get_driver_info_type2(const char *name);
  126. void replayer_free_driver_info(replayer_sound_driver_info *info);
  127.  
  128. /* Preferences for playing sound. */
  129. void replayer_set_sound_quality(replayer_file *obj, int quality /* 1--4 */);
  130. void replayer_set_skip_late_data(replayer_file *obj, bool skip);
  131.  
  132. /* Methods dealing with playing the file. */
  133. char *replayer_get_driver_filename(const replayer_soundtrack_info *info);
  134. char *replayer_obj_get_driver_filename(const replayer_file *obj, int track);
  135. #define replayer_play_ALLOC_ERROR    1    /* Couldn't allocate */
  136. #define replayer_play_DRIVER_ERROR    2    /* Couldn't load driver */
  137. #define replayer_play_FORMAT_ERROR    3    /* File unsuitable */
  138. #define replayer_play_FILE_ERROR    4    /* Couldn't open file */
  139. int replayer_sound_play(replayer_file *obj, int track);
  140. void replayer_sound_stop(replayer_file *obj);
  141. void replayer_sound_tidy(replayer_file *obj);
  142.  
  143. /* Method for feeding hungry sound drivers. */
  144. #define replayer_feed_FINISHED        -2
  145. #define replayer_feed_SUCCESS        -1
  146. #define replayer_feed_FILE_ERROR    1
  147. #define replayer_feed_ALLOC_ERROR    2
  148. #define replayer_feed_FATAL        3
  149. int replayer_sound_feed(replayer_file *obj);
  150. const int *replayer_get_poll_word(replayer_file *obj);
  151.  
  152. /* Methods for inflight entertainment. */
  153. int replayer_sound_set_pause(replayer_file *obj, bool flag);
  154. bool replayer_sound_get_pause(const replayer_file *obj);
  155. int replayer_sound_set_mute(replayer_file *obj, bool flag);
  156. bool replayer_sound_get_mute(const replayer_file *obj);
  157. int replayer_sound_get_time(const replayer_file *obj);
  158.  
  159. #ifndef replayer_NO_BACKWARDS
  160. /* For playing sound backwards! */
  161. int replayer_set_backwards(replayer_file *obj, bool flag);
  162. bool replayer_get_backwards(const replayer_file *obj);
  163. #endif
  164.  
  165.  
  166. /* Low-level structures and internal functions. */
  167.  
  168. char *replayer_read_header_line(FILE *file);
  169. int replayer_read_header_number(FILE *file);
  170.  
  171.  
  172. #ifdef __cplusplus
  173. }
  174. #endif
  175.  
  176. #endif
  177.